﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using l1cs.server.model;
using l1cs.server.serverpackets;
using l1cs.server.datatables;
using System.IO;

namespace l1cs.server.clientpackets
{
    public class C_LeaveClan : ClientBasePacket
    {
        private const String _C_LEAVE_CLAN = "[C] C_LeaveClan";
        private static Logger _log = Logger.getLogger( typeof( C_LeaveClan ).FullName );

        public C_LeaveClan( byte[] abyte0, ClientThread clientthread )
            : base( abyte0 )
        {

            L1PcInstance player = clientthread.getActiveChar();
            String player_name = player.getName();
            String clan_name = player.getClanname();
            int clan_id = player.getClanid();
            if ( clan_id == 0 )
            {// クラン未所属
                return;
            }

            L1Clan clan = L1World.getInstance().getClan( clan_name );
            if ( clan != null )
            {
                String[] clan_member_name = clan.getAllMembers();
                int i;
                if ( player.isCrown() && player.getId() == clan.getLeaderId() )
                { // プリンスまたはプリンセス、かつ、血盟主
                    int castleId = clan.getCastleId();
                    int houseId = clan.getHouseId();
                    if ( castleId != 0 || houseId != 0 )
                    {
                        player.sendPackets( new S_ServerMessage( 665 ) ); // \f1城やアジトを所有した状態で血盟を解散することはできません。
                        return;
                    }
                    foreach ( L1War war in L1World.getInstance().getWarList() )
                    {
                        if ( war.CheckClanInWar( clan_name ) )
                        {
                            player.sendPackets( new S_ServerMessage( 302 ) ); // \f1解散させることができません。
                            return;
                        }
                    }

                    for ( i = 0; i < clan_member_name.Length; i++ )
                    { // クラン員のクラン情報をクリア
                        L1PcInstance online_pc = L1World.getInstance().getPlayer(
                                clan_member_name[i] );
                        if ( online_pc != null )
                        { // オンライン中のクラン員
                            online_pc.setClanid( 0 );
                            online_pc.setClanname( "" );
                            online_pc.setClanRank( 0 );
                            online_pc.setTitle( "" );
                            online_pc.sendPackets( new S_CharTitle( online_pc
                                    .getId(), "" ) );
                            online_pc.broadcastPacket( new S_CharTitle( online_pc
                                    .getId(), "" ) );
                            online_pc.save(); // DBにキャラクター情報を書き込む
                            online_pc.sendPackets( new S_ServerMessage( 269,
                                    player_name, clan_name ) ); // %1血盟の血盟主%0が血盟を解散させました。
                        }
                        else
                        { // オフライン中のクラン員
                            L1PcInstance offline_pc = CharacterTable
                                    .getInstance().restoreCharacter(
                                            clan_member_name[i] );
                            offline_pc.setClanid( 0 );
                            offline_pc.setClanname( "" );
                            offline_pc.setClanRank( 0 );
                            offline_pc.setTitle( "" );
                            offline_pc.save(); // DBにキャラクター情報を書き込む
                        }
                    }
                    String emblem_file = Convert.ToString( clan_id );
                    //File file = new File("emblem/" + emblem_file);
                    File.Delete( "emblem/" + emblem_file );
                    ClanTable.getInstance().deleteClan( clan_name );
                }
                else
                { // 血盟主以外
                    L1PcInstance[] clanMember = clan.getOnlineClanMember();
                    for ( i = 0; i < clanMember.Length; i++ )
                    {
                        clanMember[i].sendPackets( new S_ServerMessage( 178,
                                player_name, clan_name ) ); // \f1%0が%1血盟を脱退しました。
                    }
                    if ( clan.getWarehouseUsingChar() // 自キャラがクラン倉庫使用中
                            == player.getId() )
                    {
                        clan.setWarehouseUsingChar( 0 ); // クラン倉庫のロックを解除
                    }
                    player.setClanid( 0 );
                    player.setClanname( "" );
                    player.setClanRank( 0 );
                    player.setTitle( "" );
                    player.sendPackets( new S_CharTitle( player.getId(), "" ) );
                    player.broadcastPacket( new S_CharTitle( player.getId(), "" ) );
                    player.save(); // DBにキャラクター情報を書き込む
                    clan.delMemberName( player_name );
                }
            }
            else
            {
                player.setClanid( 0 );
                player.setClanname( "" );
                player.setClanRank( 0 );
                player.setTitle( "" );
                player.sendPackets( new S_CharTitle( player.getId(), "" ) );
                player.broadcastPacket( new S_CharTitle( player.getId(), "" ) );
                player.save(); // DBにキャラクター情報を書き込む
                player
                        .sendPackets( new S_ServerMessage( 178, player_name,
                                clan_name ) ); // \f1%0が%1血盟を脱退しました。
            }
        }

        override
        public String getType()
        {
            return _C_LEAVE_CLAN;
        }
    }
}
